import java.util.Scanner;

/**
 * 课程：JavaOOP ，山西应用科技学院信息工程学院计算机科学与技术专业 2201班
 *
 * @author by 2022010101张三
 * {@code @user Administrator}
 * {@code @Date 2025/3/11 12:21}
 * {@code @Description} Java基础变成：巩固基本变量，数组，循环控制，方法，及其相关工程细节
 * TODO：任务：利用数组存放n个学生的m门课程成绩，简单统计，格式化输出。
 */
public class GradeArray {
    public static void main(String[] args) {
        System.out.println("================ 成绩单 ===============");
        Scanner scanner = new Scanner(System.in);   // 创建一个扫描器对象
        System.out.println("请输入学生人数：");       // 提示用户输入学生人数
        int n = scanner.nextInt();  // 读取学生人数
        System.out.println("请输入课程数：");  // 提示用户输入课程数
        int m = scanner.nextInt();  // 读取课程数

        double[][] grades = new double[n][m];   //二维数组的声明语句
        for (int i = 0; i < m; i++) {
            System.out.printf("%5s\t","课程"+i);   //中英文宽度不同，用\t控制
        }
        System.out.println();    //输出回车换行
        for (int i = 0; i < n; i++) {   // 遍历学生人数
            for (int j = 0; j < m; j++) {   // 遍历课程数
                grades[i][j] = 15.0+Math.random()*85.0;  // 初始化各科学生成绩[15,100)
            }
        }
        for (double[] gs:grades) {   //foreach循环，首先取出某个学生的各科成绩
            for (double g:gs) {   //取出某一科成绩
                System.out.printf("%5.1f\t",g);   // 输出某个学生某科成绩
            }
            System.out.println();   //输出回车换行
        }
        output(n,m);    //调用静态方法，传入两个参数
        output(5,5);    //调用静态方法，传入两个参数
        statistics(50,8);
    }
    public static void output(int n,int m){
        double[][] grades = new double[n][m];   //数组的声明语句
        for (int i = 0; i < m; i++) {
            System.out.printf("%5s\t","课程"+i);   //中英文宽度不同，用\t控制
        }
         System.out.println();    //输出回车换行
        for (int i = 0; i < n; i++) {   // 遍历学生人数
            for (int j = 0; j < m; j++) {   // 遍历课程数
                grades[i][j] = 20.0+Math.random()*80.0;  // 初始化各科学生成绩[15,100)
            }
        }
        for (double[] gs:grades) {   //foreach循环，首先取出某个学生的各科成绩
            for (double g:gs) {   //取出某一科成绩
                System.out.printf("%5.1f\t",g);   // 输出某个学生某科成绩
            }
            System.out.println();   //输出回车换行
        }
    }
    public static void statistics(int n,int m){ //成绩单简单数据统计
        double[][] grades = new double[n][m];   //数组的声明语句
        for (int i = 0; i < m; i++) {   //输出表头
            System.out.printf("%5s\t","课程"+i);   //中英文宽度不同，用\t控制
        }
        System.out.println("平均\t\t最大\t\t最小");
        for (int i = 0; i < n; i++) {   // 遍历学生人数
            for (int j = 0; j < m; j++) {   // 遍历课程数
                grades[i][j] = 30.0+Math.random()*70.0;  // 初始化各科学生成绩[15,100)
            }
        }
        for (double[] gs:grades) {   //foreach循环，首先取出某个学生的各科成绩
            double aver=0.0;    //平均值
            double max=gs[0];   //暂定最大值为科目0
            double min=gs[0];   //暂定最小值为科目0
            for (double g:gs) {     //取出某一科成绩
                aver+=g;    //简单统计，平均值计算先计算累计
                if(max<g) max=g;  //最大值
                if(min>g) min=g;  //最小值
                System.out.printf("%5.1f\t",g);   // 输出某个学生某科成绩
            }
            System.out.printf("%5.1f\t%5.1f\t%5.1f\n",aver/m,max,min);   //输出回车换行
        }
    }
}
